*Figure 1. Global Supply Chain Logistics — Image Source: Unsplash (free license).

1 Importing and Exploring the Data

The dataset used in this project, titled Supply Chain Logistics Problem, was originally published on Kaggle by shivaiyer129 (2013). It contains shipment records with variables such as product weight, unit quantity, plant location, and the number of days shipped early or late. This project aims to analyze shipping performance across multiple manufacturing plants to identify operational inefficiencies and improvement opportunities.

The dataset was imported using the readxl package and cleaned with janitor::clean_names() to standardize variable names and ensure consistent formatting throughout the analysis.

## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## 
## Attaching package: 'janitor'
## 
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
## 
## 
## 
## Attaching package: 'plotly'
## 
## 
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## 
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## 
## The following object is masked from 'package:graphics':
## 
##     layout
## Rows: 9,215
## Columns: 14
## $ order_id             <dbl> 1447296447, 1447158015, 1447138899, 1447363528, 1…
## $ order_date           <dttm> 2013-05-26, 2013-05-26, 2013-05-26, 2013-05-26, …
## $ origin_port          <chr> "PORT09", "PORT09", "PORT09", "PORT09", "PORT09",…
## $ carrier              <chr> "V44_3", "V44_3", "V44_3", "V44_3", "V44_3", "V44…
## $ tpt                  <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ service_level        <chr> "CRF", "CRF", "CRF", "CRF", "CRF", "CRF", "CRF", …
## $ ship_ahead_day_count <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3…
## $ ship_late_day_count  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ customer             <chr> "V55555_53", "V55555_53", "V55555_53", "V55555_53…
## $ product_id           <dbl> 1700106, 1700106, 1700106, 1700106, 1700106, 1700…
## $ plant_code           <chr> "PLANT16", "PLANT16", "PLANT16", "PLANT16", "PLAN…
## $ destination_port     <chr> "PORT09", "PORT09", "PORT09", "PORT09", "PORT09",…
## $ unit_quantity        <dbl> 808, 3188, 2331, 847, 2163, 3332, 1782, 427, 1291…
## $ weight               <dbl> 14.30, 87.94, 61.20, 16.16, 52.34, 92.80, 46.90, …

1.1 Tidying and Transforming the Data

After import, the dataset was examined for missing values and variable clarity. To evaluate shipping performance at the plant level, two new variables were created: ship_days: The difference between early and late shipment days, providing a quick indicator of schedule adherence. efficiency_score: A ratio comparing early shipments to late shipments, allowing a standardized comparison of performance across plants. This transformation allows for a meaningful, quantitative assessment of supply chain reliability across facilities.

##     order_id           order_date         origin_port          carrier         
##  Min.   :1.447e+09   Min.   :2013-05-26   Length:9215        Length:9215       
##  1st Qu.:1.447e+09   1st Qu.:2013-05-26   Class :character   Class :character  
##  Median :1.447e+09   Median :2013-05-26   Mode  :character   Mode  :character  
##  Mean   :1.447e+09   Mean   :2013-05-26                                        
##  3rd Qu.:1.447e+09   3rd Qu.:2013-05-26                                        
##  Max.   :1.447e+09   Max.   :2013-05-26                                        
##       tpt        service_level      ship_ahead_day_count ship_late_day_count
##  Min.   :0.000   Length:9215        Min.   :0.000        Min.   :0.00000    
##  1st Qu.:1.000   Class :character   1st Qu.:0.000        1st Qu.:0.00000    
##  Median :2.000   Mode  :character   Median :3.000        Median :0.00000    
##  Mean   :1.718                      Mean   :1.852        Mean   :0.03993    
##  3rd Qu.:2.000                      3rd Qu.:3.000        3rd Qu.:0.00000    
##  Max.   :4.000                      Max.   :6.000        Max.   :6.00000    
##    customer           product_id       plant_code        destination_port  
##  Length:9215        Min.   :1613321   Length:9215        Length:9215       
##  Class :character   1st Qu.:1669702   Class :character   Class :character  
##  Mode  :character   Median :1683636   Mode  :character   Mode  :character  
##                     Mean   :1680536                                        
##                     3rd Qu.:1689554                                        
##                     Max.   :1702654                                        
##  unit_quantity        weight        
##  Min.   :   235   Min.   :   0.000  
##  1st Qu.:   330   1st Qu.:   1.407  
##  Median :   477   Median :   4.440  
##  Mean   :  3203   Mean   :  19.872  
##  3rd Qu.:  1276   3rd Qu.:  13.326  
##  Max.   :561847   Max.   :2338.405
## # A tibble: 7 × 7
##   plant_code total_orders avg_units avg_weight avg_ship_ahead avg_ship_late
##   <chr>             <int>     <dbl>      <dbl>          <dbl>         <dbl>
## 1 PLANT03            8541     3350.      15.9           1.81         0.0404
## 2 PLANT04               1      348        2.10          3            0     
## 3 PLANT08             102     2716.      14.5           0.706        0.225 
## 4 PLANT09              12    18652.      33.9           4.58         0     
## 5 PLANT12             300      373.      27.2           2.53         0     
## 6 PLANT13              86      504.      63.1           2.20         0     
## 7 PLANT16             173     1417.     186.            2.97         0     
## # ℹ 1 more variable: avg_efficiency <dbl>

1.1.1 Visualization of Plant Efficiency

1.1.2 Visual Insights

The Shipping Efficiency by Plant bar chart shows that PLANT09 consistently maintains the highest efficiency score, indicating stronger on time delivery performance compared to other facilities. In contrast, several plants exhibit significantly lower efficiency, suggesting recurring fulfillment delays.

The Ship Early vs. Ship Late scatter plot reinforces this finding. Most shipments cluster near zero late days, while a smaller subset of shipments with high late-day counts likely represents carrier delays, operational bottlenecks, or longer transportation routes.

1.1.3 Modeling

To explore what factors affect efficiency, a multiple linear regression was conducted using unit quantity, shipping weight, and early, late day count as the independent variable, and efficiency score as the dependent variable. This model helps identify how these features relate to performance.

## 
## Call:
## lm(formula = efficiency_score ~ unit_quantity + weight + ship_late_day_count, 
##     data = drop_na(supply))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.7627 -1.8517 -0.0872  1.1495  4.0005 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          2.854e+00  2.096e-02 136.182  < 2e-16 ***
## unit_quantity       -1.092e-05  1.323e-06  -8.258  < 2e-16 ***
## weight               1.454e-03  3.173e-04   4.581 4.69e-06 ***
## ship_late_day_count -7.618e-01  6.205e-02 -12.278  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.903 on 9211 degrees of freedom
## Multiple R-squared:  0.02344,    Adjusted R-squared:  0.02313 
## F-statistic: 73.71 on 3 and 9211 DF,  p-value: < 2.2e-16

1.1.4 Modeling Results

A multiple linear regression model was used to examine the factors influencing shipping efficiency. The results indicate, Late-day shipments have the strongest negative impact on efficiency (Estimate = -0.76, p < 0.001) .Weight has a small positive relationship with efficiency (Estimate ≈ 0.001). Unit quantity shows a slight negative relationship(Estimate < 0)

Although the model explains a modest portion of variance (R² = 0.023), it provides meaningful insight:reducing late shipments is the most effective way to improve efficiency across plants.

1.1.5 Findings & Limitations

This analysis indicates that shipping performance varies significantly across plants, with PLANT09 demonstrating notably higher reliability. The regression results highlight the impact of operational delays on efficiency, reinforcing the importance of minimizing late shipments to maintain performance standards.

However, several limitations should be noted. The dataset does not include variables such as transportation distance, carrier type, or seasonal demand patterns, which could influence delivery timelines. Future analyses could incorporate forecasting models and carrier level comparisons to improve predictive accuracy and operational planning.

1.1.6 About Me

“Figure 2. Joshua Grant, M.S. Data Science & Analytics Student, Clemson University.”

I am Joshua Grant I’m currently pursuing Master’s in Data Science and Analytics at Clemson University, building a strong foundation in statistical modeling, machine learning, and data visualization. With a passion for transforming raw data into actionable insights, I thrive on solving complex problems and uncovering trends that drive smart decision-making.This project demonstrates how data analytics can improve supply chain decision making across multiple plants.

1.1.7 View my dashboard

View Interactive Dashboard on GitHub

1.1.8 References

LS0tCnRpdGxlOiAiU3VwcGx5IENoYWluIEFuYWx5c2lzIgphdXRob3I6ICJKb3NodWEgR3JhbnQiCmRhdGU6ICIyMDI1LTEwLTE5IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogY29zbW8KLS0tCjxwIGFsaWduPSJjZW50ZXIiPgogIDxpbWcgc3JjPSJqYWNxdWVzLWRpbGxpZXMtamNhdjFDT1Z2T2MtdW5zcGxhc2guanBnIiB3aWR0aD0iNjAwcHgiPgo8L3A+CgoqRmlndXJlIDEuIEdsb2JhbCBTdXBwbHkgQ2hhaW4gTG9naXN0aWNzIOKAlCBJbWFnZSBTb3VyY2U6IFVuc3BsYXNoIChmcmVlIGxpY2Vuc2UpLgoKIyBJbXBvcnRpbmcgYW5kIEV4cGxvcmluZyB0aGUgRGF0YQoKVGhlIGRhdGFzZXQgdXNlZCBpbiB0aGlzIHByb2plY3QsIHRpdGxlZCAqU3VwcGx5IENoYWluIExvZ2lzdGljcyBQcm9ibGVtKiwgd2FzIG9yaWdpbmFsbHkgcHVibGlzaGVkIG9uIEthZ2dsZSBieSAqKnNoaXZhaXllcjEyOSAoMjAxMykqKi4gSXQgY29udGFpbnMgc2hpcG1lbnQgcmVjb3JkcyB3aXRoIHZhcmlhYmxlcyBzdWNoIGFzIHByb2R1Y3Qgd2VpZ2h0LCB1bml0IHF1YW50aXR5LCBwbGFudCBsb2NhdGlvbiwgYW5kIHRoZSBudW1iZXIgb2YgZGF5cyBzaGlwcGVkIGVhcmx5IG9yIGxhdGUuIFRoaXMgcHJvamVjdCBhaW1zIHRvIGFuYWx5emUgc2hpcHBpbmcgcGVyZm9ybWFuY2UgYWNyb3NzIG11bHRpcGxlIG1hbnVmYWN0dXJpbmcgcGxhbnRzIHRvIGlkZW50aWZ5IG9wZXJhdGlvbmFsIGluZWZmaWNpZW5jaWVzIGFuZCBpbXByb3ZlbWVudCBvcHBvcnR1bml0aWVzLgoKVGhlIGRhdGFzZXQgd2FzIGltcG9ydGVkIHVzaW5nIHRoZSBgcmVhZHhsYCBwYWNrYWdlIGFuZCBjbGVhbmVkIHdpdGggYGphbml0b3I6OmNsZWFuX25hbWVzKClgIHRvIHN0YW5kYXJkaXplIHZhcmlhYmxlIG5hbWVzIGFuZCBlbnN1cmUgY29uc2lzdGVudCBmb3JtYXR0aW5nIHRocm91Z2hvdXQgdGhlIGFuYWx5c2lzLgoKYGBge3Igc2V0dXAsIGVjaG89RkFMU0V9CiMgTG9hZCBwYWNrYWdlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShEVCkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZ2dwbG90MikKCiMgSW1wb3J0IGRhdGFzZXQKc3VwcGx5IDwtIHJlYWRfZXhjZWwoImRhdGEvc3VwcGx5X2NoYWluX2RhdGEueGxzeCIpCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFfQojIG1ha2UgY29sdW1uIG5hbWVzIGNvbnNpc3RlbnQgCnN1cHBseSA8LSBzdXBwbHkgJT4lCiAgY2xlYW5fbmFtZXMoKQoKZ2xpbXBzZShzdXBwbHkpCmBgYAoKIyMgVGlkeWluZyBhbmQgVHJhbnNmb3JtaW5nIHRoZSBEYXRhCgpBZnRlciBpbXBvcnQsIHRoZSBkYXRhc2V0IHdhcyBleGFtaW5lZCBmb3IgbWlzc2luZyB2YWx1ZXMgYW5kIHZhcmlhYmxlIGNsYXJpdHkuIFRvIGV2YWx1YXRlIHNoaXBwaW5nIHBlcmZvcm1hbmNlIGF0IHRoZSBwbGFudCBsZXZlbCwgdHdvIG5ldyB2YXJpYWJsZXMgd2VyZSBjcmVhdGVkOiAqKnNoaXBfZGF5cyoqOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGVhcmx5IGFuZCBsYXRlIHNoaXBtZW50IGRheXMsIHByb3ZpZGluZyBhIHF1aWNrIGluZGljYXRvciBvZiBzY2hlZHVsZSBhZGhlcmVuY2UuICoqZWZmaWNpZW5jeV9zY29yZSoqOiBBIHJhdGlvIGNvbXBhcmluZyBlYXJseSBzaGlwbWVudHMgdG8gbGF0ZSBzaGlwbWVudHMsIGFsbG93aW5nIGEgc3RhbmRhcmRpemVkIGNvbXBhcmlzb24gb2YgcGVyZm9ybWFuY2UgYWNyb3NzIHBsYW50cy4gVGhpcyB0cmFuc2Zvcm1hdGlvbiBhbGxvd3MgZm9yIGEgbWVhbmluZ2Z1bCwgcXVhbnRpdGF0aXZlIGFzc2Vzc21lbnQgb2Ygc3VwcGx5IGNoYWluIHJlbGlhYmlsaXR5IGFjcm9zcyBmYWNpbGl0aWVzLgoKYGBge3IsIGVjaG89RkFMU0V9CnN1bW1hcnkoc3VwcGx5KQoKIyBUb3RhbCBTaGlwbWVudCB0aW1lIChhaGVhZCAtIGxhdGUpIGFuZCBlZmZpY2llbnRjeSBzY29yZSBvZiBvbi10aW1lIHZzIGxhdGUgc2hpcG1lbnQKc3VwcGx5IDwtIHN1cHBseSAlPiUKICBtdXRhdGUoCiAgICBzaGlwX2RheXMgPSBzaGlwX2FoZWFkX2RheV9jb3VudCAtIHNoaXBfbGF0ZV9kYXlfY291bnQsCiAgICBlZmZpY2llbmN5X3Njb3JlID0gKHNoaXBfYWhlYWRfZGF5X2NvdW50ICsgMSkgLyAoc2hpcF9sYXRlX2RheV9jb3VudCArIDEpCiAgKQoKIyBQbGFudCBTdW1tYXJ5CgpwX3N1bW1hcnkgPC0gc3VwcGx5ICU+JQogIGdyb3VwX2J5KHBsYW50X2NvZGUpICU+JQogIHN1bW1hcmlzZSgKICAgIHRvdGFsX29yZGVycyA9IG4oKSwKICAgIGF2Z191bml0cyA9IG1lYW4odW5pdF9xdWFudGl0eSwgbmEucm0gPSBUUlVFKSwKICAgIGF2Z193ZWlnaHQgPSBtZWFuKHdlaWdodCwgbmEucm0gPSBUUlVFKSwKICAgIGF2Z19zaGlwX2FoZWFkID0gbWVhbihzaGlwX2FoZWFkX2RheV9jb3VudCwgbmEucm0gPSBUUlVFKSwKICAgIGF2Z19zaGlwX2xhdGUgPSBtZWFuKHNoaXBfbGF0ZV9kYXlfY291bnQsIG5hLnJtID0gVFJVRSksCiAgICBhdmdfZWZmaWNpZW5jeSA9IG1lYW4oZWZmaWNpZW5jeV9zY29yZSwgbmEucm0gPSBUUlVFKQogICkKCnBfc3VtbWFyeQogIApgYGAKCiMjIyBWaXN1YWxpemF0aW9uIG9mIFBsYW50IEVmZmljaWVuY3kKCmBgYHtyLCBlY2hvPUZBTFNFfQojIFBsb3Qgb2YgU2hpcHBpbmcgRWZmaWVuY3kgQXZlcmFnZQpnZ3Bsb3QocF9zdW1tYXJ5LCBhZXMoeD0gcmVvcmRlcihwbGFudF9jb2RlLCAtYXZnX2VmZmljaWVuY3kpLCB5PSBhdmdfZWZmaWNpZW5jeSwgZmlsbCA9IHBsYW50X2NvZGUpKSArCiAgZ2VvbV9jb2woKSArCiAgbGFicyh0aXRsZSA9ICJTaGlwcGluZyBFZmZpY2llbmN5IGJ5IFBsYW50IiwKICAgICAgIHggPSAiUGxhbnQgQ29kZSIsCiAgICAgICB5ID0gIkVmZmljaWVuY3kgU2NvcmUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKIyBQbG90IHRvIHNob3cgU2hpcHBpbmcgQmVoYXZpb3IgYmV0d2VlbiBFYXJseSBhbmQgTGF0ZSBEYXlzCmdncGxvdChzdXBwbHksIGFlcyh4ID0gc2hpcF9haGVhZF9kYXlfY291bnQsIHkgPSBzaGlwX2xhdGVfZGF5X2NvdW50LCBjb2xvciA9IHBsYW50X2NvZGUpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGxhYnModGl0bGUgPSAiU2hpcCBFYXJseSB2cyBTaGlwIExhdGUgQ291bnRzIiwKICAgICAgIHggPSAiRGF5cyBTaGlwcGVkIEVhcmx5IiwKICAgICAgIHkgPSAiRGF5cyBTaGlwcGVkIExhdGUiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMjIFZpc3VhbCBJbnNpZ2h0cwoKVGhlICoqU2hpcHBpbmcgRWZmaWNpZW5jeSBieSBQbGFudCoqIGJhciBjaGFydCBzaG93cyB0aGF0ICoqUExBTlQwOSBjb25zaXN0ZW50bHkgbWFpbnRhaW5zIHRoZSBoaWdoZXN0IGVmZmljaWVuY3kgc2NvcmUqKiwgaW5kaWNhdGluZyBzdHJvbmdlciBvbiB0aW1lIGRlbGl2ZXJ5IHBlcmZvcm1hbmNlIGNvbXBhcmVkIHRvIG90aGVyIGZhY2lsaXRpZXMuIEluIGNvbnRyYXN0LCBzZXZlcmFsIHBsYW50cyBleGhpYml0IHNpZ25pZmljYW50bHkgbG93ZXIgZWZmaWNpZW5jeSwgc3VnZ2VzdGluZyByZWN1cnJpbmcgZnVsZmlsbG1lbnQgZGVsYXlzLgoKVGhlICoqU2hpcCBFYXJseSB2cy4gU2hpcCBMYXRlKiogc2NhdHRlciBwbG90IHJlaW5mb3JjZXMgdGhpcyBmaW5kaW5nLiBNb3N0IHNoaXBtZW50cyBjbHVzdGVyIG5lYXIgemVybyBsYXRlIGRheXMsIHdoaWxlIGEgc21hbGxlciBzdWJzZXQgb2Ygc2hpcG1lbnRzIHdpdGggaGlnaCBsYXRlLWRheSBjb3VudHMgbGlrZWx5IHJlcHJlc2VudHMgY2FycmllciBkZWxheXMsIG9wZXJhdGlvbmFsIGJvdHRsZW5lY2tzLCBvciBsb25nZXIgdHJhbnNwb3J0YXRpb24gcm91dGVzLgoKIyMjIE1vZGVsaW5nCgpUbyBleHBsb3JlIHdoYXQgZmFjdG9ycyBhZmZlY3QgZWZmaWNpZW5jeSwgYSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiB3YXMgY29uZHVjdGVkIHVzaW5nIHVuaXQgcXVhbnRpdHksIHNoaXBwaW5nIHdlaWdodCwgYW5kIGVhcmx5LCBsYXRlIGRheSBjb3VudCBhcyB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUsIGFuZCBlZmZpY2llbmN5IHNjb3JlIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuIFRoaXMgbW9kZWwgaGVscHMgaWRlbnRpZnkgaG93IHRoZXNlIGZlYXR1cmVzIHJlbGF0ZSB0byBwZXJmb3JtYW5jZS4KCmBgYHtyLCBlY2hvPUZBTFNFfQojIHdoYXQgZmFjdG9ycyBlZmZlY3QgZWZmaWNpZW5jeSB1c2luZyBsaW5lYXIgcmVncmVzc2lvbgptb2RlbCA8LSBsbShlZmZpY2llbmN5X3Njb3JlIH4gdW5pdF9xdWFudGl0eSArIHdlaWdodCArIHNoaXBfbGF0ZV9kYXlfY291bnQsIGRhdGEgPSBkcm9wX25hKHN1cHBseSkpCgpzdW1tYXJ5KG1vZGVsKQpgYGAKIyMjIE1vZGVsaW5nIFJlc3VsdHMKCkEgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgd2FzIHVzZWQgdG8gZXhhbWluZSB0aGUgZmFjdG9ycyBpbmZsdWVuY2luZyBzaGlwcGluZyBlZmZpY2llbmN5LiBUaGUgcmVzdWx0cyBpbmRpY2F0ZSwgICoqTGF0ZS1kYXkgc2hpcG1lbnRzKiogaGF2ZSB0aGUgc3Ryb25nZXN0IG5lZ2F0aXZlIGltcGFjdCBvbiBlZmZpY2llbmN5ICooRXN0aW1hdGUgPSAtMC43NiwgcCA8IDAuMDAxKSogLioqV2VpZ2h0KiogaGFzIGEgc21hbGwgcG9zaXRpdmUgcmVsYXRpb25zaGlwIHdpdGggZWZmaWNpZW5jeSAqKEVzdGltYXRlIOKJiCAwLjAwMSkqLiAqKlVuaXQgcXVhbnRpdHkqKiBzaG93cyBhIHNsaWdodCBuZWdhdGl2ZSByZWxhdGlvbnNoaXAqKEVzdGltYXRlIDwgMCkqCgpBbHRob3VnaCB0aGUgbW9kZWwgZXhwbGFpbnMgYSBtb2Rlc3QgcG9ydGlvbiBvZiB2YXJpYW5jZSAqKFLCsiA9IDAuMDIzKSosIGl0IHByb3ZpZGVzIG1lYW5pbmdmdWwgaW5zaWdodDpyZWR1Y2luZyBsYXRlIHNoaXBtZW50cyBpcyB0aGUgbW9zdCBlZmZlY3RpdmUgd2F5IHRvIGltcHJvdmUgZWZmaWNpZW5jeSBhY3Jvc3MgcGxhbnRzLgoKIyMjIEZpbmRpbmdzICYgTGltaXRhdGlvbnMKClRoaXMgYW5hbHlzaXMgaW5kaWNhdGVzIHRoYXQgc2hpcHBpbmcgcGVyZm9ybWFuY2UgdmFyaWVzIHNpZ25pZmljYW50bHkgYWNyb3NzIHBsYW50cywgd2l0aCAqKlBMQU5UMDkgZGVtb25zdHJhdGluZyBub3RhYmx5IGhpZ2hlciByZWxpYWJpbGl0eSoqLiBUaGUgcmVncmVzc2lvbiByZXN1bHRzIGhpZ2hsaWdodCB0aGUgaW1wYWN0IG9mIG9wZXJhdGlvbmFsIGRlbGF5cyBvbiBlZmZpY2llbmN5LCByZWluZm9yY2luZyB0aGUgaW1wb3J0YW5jZSBvZiBtaW5pbWl6aW5nIGxhdGUgc2hpcG1lbnRzIHRvIG1haW50YWluIHBlcmZvcm1hbmNlIHN0YW5kYXJkcy4KCkhvd2V2ZXIsIHNldmVyYWwgbGltaXRhdGlvbnMgc2hvdWxkIGJlIG5vdGVkLiBUaGUgZGF0YXNldCBkb2VzIG5vdCBpbmNsdWRlIHZhcmlhYmxlcyBzdWNoIGFzIHRyYW5zcG9ydGF0aW9uIGRpc3RhbmNlLCBjYXJyaWVyIHR5cGUsIG9yIHNlYXNvbmFsIGRlbWFuZCBwYXR0ZXJucywgd2hpY2ggY291bGQgaW5mbHVlbmNlIGRlbGl2ZXJ5IHRpbWVsaW5lcy4gRnV0dXJlIGFuYWx5c2VzIGNvdWxkIGluY29ycG9yYXRlIGZvcmVjYXN0aW5nIG1vZGVscyBhbmQgY2FycmllciBsZXZlbCBjb21wYXJpc29ucyB0byBpbXByb3ZlIHByZWRpY3RpdmUgYWNjdXJhY3kgYW5kIG9wZXJhdGlvbmFsIHBsYW5uaW5nLgoKIyMjIEFib3V0IE1lCgo8cCBhbGlnbj0iY2VudGVyIj4KICA8aW1nIHNyYz0iamtnaGVhZHNob3QuanBlZyIgd2lkdGg9IjIwMHB4Ij4KPC9wPgoKKiJGaWd1cmUgMi4gSm9zaHVhIEdyYW50LCBNLlMuIERhdGEgU2NpZW5jZSAmIEFuYWx5dGljcyBTdHVkZW50LCBDbGVtc29uIFVuaXZlcnNpdHkuIioKCgoqKkkgYW0gSm9zaHVhIEdyYW50KiogSeKAmW0gY3VycmVudGx5IHB1cnN1aW5nICAqTWFzdGVy4oCZcyBpbiBEYXRhIFNjaWVuY2UgYW5kIEFuYWx5dGljcyBhdCogKipDbGVtc29uIFVuaXZlcnNpdHkqKiwgYnVpbGRpbmcgYSBzdHJvbmcgZm91bmRhdGlvbiBpbiAqKnN0YXRpc3RpY2FsIG1vZGVsaW5nKiosICoqbWFjaGluZSBsZWFybmluZyoqLCBhbmQgKipkYXRhIHZpc3VhbGl6YXRpb24qKi4gV2l0aCBhIHBhc3Npb24gZm9yIHRyYW5zZm9ybWluZyByYXcgZGF0YSBpbnRvIGFjdGlvbmFibGUgaW5zaWdodHMsIEkgdGhyaXZlIG9uIHNvbHZpbmcgY29tcGxleCBwcm9ibGVtcyBhbmQgdW5jb3ZlcmluZyB0cmVuZHMgdGhhdCBkcml2ZSBzbWFydCBkZWNpc2lvbi1tYWtpbmcuVGhpcyBwcm9qZWN0IGRlbW9uc3RyYXRlcyBob3cgZGF0YSBhbmFseXRpY3MgY2FuIGltcHJvdmUgc3VwcGx5IGNoYWluIGRlY2lzaW9uIG1ha2luZyBhY3Jvc3MgbXVsdGlwbGUgcGxhbnRzLgoKIyMjIFZpZXcgbXkgZGFzaGJvYXJkClsqKlZpZXcgSW50ZXJhY3RpdmUgRGFzaGJvYXJkIG9uIEdpdEh1YioqXShKb3NoX0dyYW50X0Rhc2hib2FyZCAuUm1kKSAKCiMjIyBSZWZlcmVuY2VzCi0gSXllciwgUy4gKDIwMjEpLiAqU3VwcGx5IENoYWluIExvZ2lzdGljcyBQcm9ibGVtIERhdGFzZXQqLiBLYWdnbGUuCi0gRGlsbGllcywgSi4gKDIwMjEpLiAqU3VwcGx5IGNoYWluIGNvbnRhaW5lcnMgcGhvdG8qIFtQaG90b2dyYXBoXS4gVW5zcGxhc2guIGh0dHBzOi8vdW5zcGxhc2guY29tL3Bob3Rvcy9qY2F2MUNPVnZPYyAgCg==